package cn.tf.tfpay.fap.server;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

/**
 *  本地文件访问代理.
 *  
 * @author liuxianbo
 * @date 2019-12-23
 */
public interface FapFacade2 {
	
	/** 判断文件(目录)是否存在 */
	@GetMapping("/exists/{path}")
	public boolean exists(RemoteFile file);

	/** 获取文件(目录)信息,如不存在返回null */
	@GetMapping("/get/{path}")
	public RemoteFile get(RemoteFile file);

	/** 列举目录下的文件,返回码: 400-文件不存在或不是目录. */
	@GetMapping({ "/list/{path}", "/list/{path}/{regex}" })
	public List<RemoteFile> list(RemoteFile file, @PathVariable(required = false) String regex);

	/**
	 * 删除文件, 暂不提供强制删除能力,避免误删. 
	 * 
	 * @param path 文件路径
	 * @return true: 删除成功,false:删除失败,没权限
	 */
	@GetMapping({ "/deleteFile/{path}" })
	public boolean deleteFile(RemoteFile file);
	
	/**
	 * 删除文件夹, 暂不提供强制删除能力,避免误删.  <br/>
	 * 注: 非空文件夹也以能删.
	 * 
	 * @param path 文件(夹)路径
	 * @return true: 删除成功,false:删除失败,没权限或文件夹非空
	 */
	@GetMapping({ "/deleteDir/{path}" })
	public boolean deleteDir(RemoteFile file);
	
	/**
	 * 新建文件夹, 不包括其上级目录.  <br/>
	 * 注: 非空文件夹也以能删.
	 * 
	 * @param path 文件(夹)路径
	 * @return true: 删除成功,false:删除失败,没权限或文件夹非空
	 */
	@GetMapping({ "/makeDir/{path}" })
	public boolean makeDir(RemoteFile file);

	/**
	 * 以流的形式读取文件,用了缓冲,适合大文件. <br/>
	 * 返回码: 400-文件不存在,500-读取异常.
	 * 
	 * @param path     文件路径
	 * @param response
	 * @throws Exception
	 */
	@GetMapping("/readStream/{path}")
	public void readStream(@RequestBody RemoteFile file, HttpServletResponse response);

	/**
	 * 读取文件内容, 并以base64编码后返回. <br/>
	 * 返回码: 400-文件不存在;文件太大,500-读取异常.
	 * 
	 * @param path 文件路径
	 */
	@GetMapping("/readBase64/{path}")
	public String readBase64(@RequestBody RemoteFile file);

	/**
	 * 读取请求报文体, base64解码后,写入指定文件. <br/>
	 * 返回码: 200-成功, 400-文件已存在; 500-读取异常.
	 * 
	 * @param path 文件路径
	 * @return 文件大小.
	 */
	@PostMapping("/writeBase64/{path}")
	public long writeBase64(@PathVariable String path, @RequestBody String base64String);

	/**
	 * 读取请求流, 直接写入指定文件. <br/>
	 * 返回码: 200-成功, 400-文件已存在; 500-读取异常.
	 * 
	 * @param path 文件路径
	 * @return 文件大小.
	 */
	@PostMapping("/writeStream/{path}")
	public long writeStream(@PathVariable String path, HttpServletRequest request);
}
